import { defineConfig, loadEnv } from 'vite';
import vue from '@vitejs/plugin-vue';
// import vueJsx from '@vitejs/plugin-vue-jsx';
import checker from 'vite-plugin-checker';
// import vueDevTools from 'vite-plugin-vue-devtools';
import AutoImport from 'unplugin-auto-import/vite';
import Components from 'unplugin-vue-components/vite';
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers';

import legacy from '@vitejs/plugin-legacy';
import autoprefixer from 'autoprefixer';
// @ts-ignore
import postcssPluginPx2rem from 'postcss-plugin-px2rem';
import path from 'path';

// https://vite.dev/config/
export default defineConfig(({ mode }) => {
    // const isProd = mode === 'production';
    const env = loadEnv(mode, process.cwd());
    const isProd = env.VITE_APP_ENV === 'production';
    return {
        esbuild: {
            drop: isProd ? ['console', 'debugger'] : [] // 移除 console 和 debugger
        },
        base: './', // 设置静态资源的基础路径
        build: {
            assetsDir: 'assets',
            chunkSizeWarningLimit: 1000, //chunk 大小警告阈值（KB）
            minify: 'terser', // 启用terser代码压缩
            sourcemap: isProd ? false : 'inline', // 生产环境禁用，开发环境内联
            reportCompressedSize: false, // 禁用压缩大小报告以提高构建速度
            rollupOptions: {
                output: {
                    assetFileNames: 'assets/[ext]/[name]-[hash][extname]',
                    entryFileNames: 'assets/js/[name]-[hash].js',
                    chunkFileNames: 'assets/js/[name]-[hash].js',
                    // 实现手动分包
                    manualChunks(id) {
                        if (/(vconsole)/.test(id)) return 'tool';
                        if (id.includes('node_modules')) {
                            if (id.includes('vant')) return 'vant';
                            if (id.includes('element-plus')) return 'element-plus';
                            if (id.includes('vue')) return 'vue';
                            if (id.includes('lodash')) return 'lodash';
                            return 'vendor';
                        }
                    }
                }
            },
            target: 'es5', // 强制构建目标为ES5
            cssTarget: 'chrome49' // 针对老旧浏览器设置CSS目标
        },
        plugins: [
            vue(),
            // vueJsx(),
            // vueDevTools(),
            AutoImport({
                resolvers: [ElementPlusResolver()],
                imports: ['vue', 'vue-router'],
                dts: 'src/types/auto-imports.d.ts'
            }),
            Components({
                resolvers: [ElementPlusResolver()],
                dts: 'src/types/components.d.ts'
            }),
            checker({
                typescript: true,
                vueTsc: true,
                eslint: {
                    useFlatConfig: true,
                    lintCommand: 'eslint "./src/**/*.{ts,mts,tsx,vue,js,jsx}"'
                },
                overlay: {
                    initialIsOpen: false
                },
                terminal: true
            }),
            //兼容旧浏览器，移动端项目重点推荐！！！
            legacy({
                targets: ['defaults', 'not IE 11'],
                modernPolyfills: true, //启用现代浏览器 polyfills
                renderLegacyChunks: false // 禁用旧版本代码块生成
            })
        ],
        // 路径别名
        resolve: {
            // alias: {
            //   '@': fileURLToPath(new URL('./src', import.meta.url)),
            // },
            alias: {
                '~': path.resolve(__dirname, './'),
                '@': path.resolve(__dirname, 'src')
            }
        },
        define: {
          CESIUM_BASE_URL: JSON.stringify('/Build/Cesium') // Cesium 静态资源路径
        },
        css: {
            postcss: {
                plugins: [
                    autoprefixer,
                    postcssPluginPx2rem({
                        remUnit: 108,
                        rootValue: 108, // 换算基数，1rem 相当于多少 px
                        unitPrecision: 5, // 允许 REM 单位增长到的十进制数字
                        propWhiteList: [], // 白名单，指定哪些属性不转换为 rem
                        propBlackList: [], // 黑名单，指定哪些属性需要转换为 rem
                        exclude: /(node_module)/, // 排除的文件夹或文件
                        selectorBlackList: [], // 要忽略并保留为 px 的选择器
                        mediaQuery: false, // 允许在媒体查询中转换 px
                        minPixelValue: 3 // 设置要替换的最小像素值
                    })
                ]
            }
        },
        server: {
            host: 'localhost',
            port: Number(env.VITE_APP_PORT),
            open: true,
            proxy: {
                [env.VITE_APP_BASE_API]: {
                    target: 'http://localhost:8080',
                    changeOrigin: true,
                    ws: true,
                    rewrite: (path) => path.replace(new RegExp('^' + env.VITE_APP_BASE_API), '')
                },
              '/realspace': {
                target: 'http://www.supermapol.com',
                changeOrigin: true,
                rewrite: (path) => path.replace(/^\/realspace/, '/realspace'),
              }
            }
        },
        optimizeDeps: {
            include: ['vue', 'element-plus'] // 预构建常用依赖
        }
    };
});
